package com.lql.sort;

import java.util.Arrays;
import java.util.Random;

/**
 * 基数排序
 */
public class RadixSort {
    public static void main(String[] args) {
        int[] ints = new int[8000000];
        Random random = new Random();
        for (int i = 0; i < 8000000; i++) {
            ints[i] = random.nextInt(8000000);
        }
        int[] array = {1, 2, 3, 7, 0};
        long startTime = System.currentTimeMillis();
        System.out.println("开始：" + startTime);
        radixSort(ints);
        long endTime = System.currentTimeMillis();
        System.out.println("结束：" + endTime);
        float l = (endTime - startTime) / 1000f;
        System.out.println("总时间：" + l + "秒");
    }

    /**
     * 实现基数排序的算法
     *
     * @param arr 待排序的数组
     */
    public static void radixSort(int[] arr) {
        //定义一个二维数组用来表示十个不同的桶
        int[][] bucket = new int[10][arr.length];
        //定义一个一维数组用来存储每个桶中的元素个数
        int[] bucketElementCount = new int[10];
        // 获取arr中最大的元素位数
        int maxElement = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (maxElement < arr[i]) {
                maxElement = arr[i];
            }
        }
        //最大值的位数
        int maxCount = String.valueOf(maxElement).length();
        //遍历maxCount次
        for (int i = 0, n = 1; i < maxCount; i++, n *= 10) {
            //向桶中放置元素
            for (int j = 0; j < arr.length; j++) {
                //计算放置哪个桶
                int k = arr[j] / n % 10;
                bucket[k][bucketElementCount[k]] = arr[j];
                bucketElementCount[k]++;
            }
            //取出桶中元素重新拷贝到原数组
            int index = 0;
            for (int k = 0; k < bucketElementCount.length; k++) {
                if (bucketElementCount[k] != 0) {
                    for (int j = 0; j < bucketElementCount[k]; j++) {
                        arr[index] = bucket[k][j];
                        index++;
                    }
                    bucketElementCount[k] = 0;
                }
            }
        }
    }
}
